<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<pre style="font-size: 20px">
  函数内定义函数
  闭包 函数定义的函数 数据从本地（没有）->函数的上一级取得
  this和闭包完全不同，有点像bind和箭头函数
  闭包是由函数以及创建该函数的词法环境组合而成。->这个环境包含了这个闭包创建时所能访问的所有局部变量。
  共享相同的函数定义，但是保存了不同的词法环境。
  目的：面向对象编程
  通常你使用只有一个方法的对象的地方，都可以使用闭包。
  闭包很有用，因为它允许将函数与其所操作的某些数据（环境）关联起来。
  模块模式（module pattern）：用闭包模拟私有方法
  var Counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }
})();
</pre>

<script>
  console.group('词法作用域')

  function init() {
    let name = "Mozilla"; // name 是一个被 init 创建的局部变量
    function displayName() { // displayName() 是内部函数,一个闭包
      console.log(name); // 使用了父函数中声明的变量
    }

    displayName();
  }

  init();


  function makeFunc() {
    let name = "Mozilla123";
    function displayName() {
      console.log(name);
    }
    return displayName;
  }

  let myFunc = makeFunc();
  myFunc();
  console.groupEnd()
</script>
</body>
</html>
